package net.wangds.common.base.config;

import net.wangds.common.base.funcs.Functions;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.LoggerFactory;

import java.util.function.BiConsumer;

/**
 * 系统常量.
 */
public interface Constants {

    /**
     * 是否打印配置的环境变量名.
     */
    String OS_ENV_KEY_SHOW_CONFIG = "SHOW_CONFIG";

    /**
     * 是否在启动的时候打印配置.
     * <ul>
     *     <li>OFF:不打印,默认值;</li>
     *     <li>ON:打印.</li>
     * </ul>
     */
    String OS_ENV_SHOW_CONFIG = Functions.nvl(System.getenv(Constants.OS_ENV_KEY_SHOW_CONFIG),"OFF");

    /**
     * 是否在启动时打印配置.
     * <p>真值支持环境变量设置为:"<code>ON</code>","<code>YES</code>","<code>TRUE</code>","<code>T</code>",
     * "<code>Y</code>"，其他值为"<code>false</code>".</p>
     * @see #OS_ENV_KEY_SHOW_CONFIG
     * @see #OS_ENV_SHOW_CONFIG
     * @return 是否打印.
     */
    static boolean isShowConfig(){
        return StringUtils.equalsAnyIgnoreCase(OS_ENV_SHOW_CONFIG, "ON","YES","TRUE","T","Y");
    }

    /**
     * 根据系统环境变量SHOW_CONFIG配置，决定执行不同任务.
     * @param onShowConfig {@link #isShowConfig()}返回"<code>true</code>"时执行的任务.
     * @param onOff {@link #isShowConfig()}返回"<code>false</code>"时执行的任务.
     * @see #OS_ENV_KEY_SHOW_CONFIG
     * @see #isShowConfig()
     */
    static void whenShowConfig(Runnable onShowConfig, BiConsumer<String, Boolean> onOff){
        if(isShowConfig()){
            if(onShowConfig!=null){
                onShowConfig.run();
            }
        }else{
            if(onOff!=null){
                onOff.accept(OS_ENV_SHOW_CONFIG, isShowConfig());
            }
        }
    }

    /**
     * 根据系统环境变量SHOW_CONFIG配置为开启时执行任务.
     * <p>{@link #isShowConfig()}为false时输出一条<code>info</code>级别消息编号为"<code>MSG000001</code>"的日志.</p>
     * @param onShowConfig {@link #isShowConfig()}返回"<code>true</code>"时执行的任务.
     * @see #OS_ENV_KEY_SHOW_CONFIG
     * @see #isShowConfig()
     */
    static void whenShowConfig(Runnable onShowConfig){
        whenShowConfig(onShowConfig, (t,b)-> LoggerFactory.getLogger(Constants.class).info(
                "[MSG000001] System environment variable "
                + OS_ENV_KEY_SHOW_CONFIG+" is \"" + t +"\", config value is"
                + b, ", wouldn't show the config items."
        ));
    }

}
